<?php

namespace common\helpers;

/**
 * LocationHelper provides a set of IP-related static methods.
 *
 * @author emhome<emhome@163.com>
 * @since 2.0
 */
class LocationHelper {

    /**
     * 地球周长
     */
    const CIRCUMFERENCE = 40065709;

    /**
     * 1.纬度1，经度1，纬度2，经度2 
     * 2.返回结果是单位是KM。
     * 3.保留一位小数
     */
    public static function getDistance($lat1, $lng1, $lat2, $lng2) {
        //将角度转为狐度
        $radLat1 = deg2rad($lat1); //deg2rad()函数将角度转换为弧度
        $radLat2 = deg2rad($lat2);
        $radLng1 = deg2rad($lng1);
        $radLng2 = deg2rad($lng2);
        $a = $radLat1 - $radLat2;
        $b = $radLng1 - $radLng2;
        return $s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))) * 6371;
//        return round($s, 1);
    }

    /**
     * 根据经纬度和半径计算出范围
     * @param string $lat 纬度 
     * @param String $lng 经度 
     * @param float $radius 半径 
     * 
     * @return Array 范围数组
     */
    public static function nearby($lat, $lng, $radius) {
        //计算地球度
        $degree = self::CIRCUMFERENCE / 360;
        $dpmLat = 1 / $degree;
        $radiusLat = $dpmLat * $radius;
        $minLat = $lat - $radiusLat; // 最小纬度 
        $maxLat = $lat + $radiusLat; // 最大纬度
        $mpdLng = $degree * cos($lat * (PI / 180));
        $dpmLng = 1 / $mpdLng;
        $radiusLng = $dpmLng * $radius;
        $minLng = $lng - $radiusLng; // 最小经度
        $maxLng = $lng + $radiusLng; // 最大经度

        return [
            'minLat' => $minLat,
            'maxLat' => $maxLat,
            'minLng' => $minLng,
            'maxLng' => $maxLng
        ];
    }

}
